﻿using System;
using System.Collections.Generic;
using System.Text;

namespace SingletonPattern
{
    /// <summary>
    /// 懒汉模式
    /// </summary>
    public class LazySingleton
    {
        // 私有静态只读object对象
        private static readonly object _ObjLock = new object();
        // 私有静态只读实例化对象，volatile 促进线程安全，保证线程有序执行 
        private static volatile LazySingleton _Instance;
        // 设置私有静态构造函数
        private LazySingleton() { }
        // 公开静态访问该类实例对象方法
        public static LazySingleton GetInstance()
        {
            // 第一重判断，先判断实例是否存在，不存在再加锁处理
            if (_Instance == null)
            {
                // 加锁的程序在某一时刻只允许一个线程访问
                lock (_ObjLock)
                {
                    // 第二重判断，防止实例被重复创建
                    if (_Instance == null)
                    {
                        _Instance = new LazySingleton();
                    }
                }
            }
            return _Instance;
        }

        //多线程环境下测试
        public string Say() => "SayHi，LazySingleton！";
    }
}
